/*!
 * \file frhashmap_varfield.h
 *
 * \brief hashmap操作
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * 结构体和相关接口，实现hashmap操作
 *
 * \version 2.0
 * \author geyh
 * \date 2014/12/22
 *
 */

#ifndef __FRHASHMAP_VARFIELD_H_
#define __FRHASHMAP_VARFIELD_H_

#include "frhash2.h"
#include "frcomm.h"

/*! @brief hashmap头(共用Frhash_header) */
typedef struct __st_hash Frhashmap_header;

/*!
 * 生成hashmap
 *
 * \param pp_hash_hdr   (Frhash_header)
 * \param ul_hash_size (hash 数组的大小)
 *
 * \return 成功时返回hash表头, 否则返回NULL
 *
 * \note  使用frhashmap_varfield_free释放  (p_hash_hdr由外部生成 单独释放)
 *
 */
int frhashmap_varfield_create(Frhashmap_header *p_hash_hdr, unsigned long ul_hash_size);

/*!
 * 生成hashmap
 *
 * \param p_hash_hdr   (*Frhashmap_header)
 *
 * \return 成功时返回hash表头, 否则返回NULL
 *
 * \note  使用frhashmap_varfield_free2释放
 *
 */
Frhashmap_header *frhashmap_varfield_create2(unsigned long ul_hash_size);

/*!
 * 释放指定hash表
 * \param p_hash_hdr   (*Frhash_header)
 *
 * \note   p_hash_hdr 头不释放
 */
void frhashmap_varfield_free(Frhashmap_header *p_hash_hdr);

/*!
 * 释放指定hash表
 * \param p_hash_hdr   (*Frhash_header)
 *
 * \note   p_hash_hdr 一同释放
 */
void frhashmap_varfield_free2(Frhashmap_header *p_hash_hdr);

/* i_loop循环用变量,p_hash_hdr hash表指针, p_lst_hdr_tmp链表用临时变量 */
#define FRHASHMAP_LOOP(i_loop,p_hash_hdr, p_lst_hdr_tmp)  \
        for(i_loop=0; i_loop < (p_hash_hdr)->ul_hash_size && (p_lst_hdr_tmp = &((p_hash_hdr)->p_list_array[i_loop]) ); i_loop++)

/*!
 * Frvar_field值节点内容增加
 *
 * \param p_hash_hdr   Frhashmap_header
 * \param p_st_field   要增加的Frvar_field类型的值
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frhashmap_varfield_add(Frhashmap_header *p_hash_hdr, Frvar_field *p_st_field);

/*!
 * hash表里查询指定Frvar_field值节点
 *
 * \param p_hash_hdr   (*Frhash_header)
 * \param p_name        (Frvar_field字段名)
 *
 * \return 成功返回Frlist_node *,否则返回NULL
 *
 */
Frvar_field *frhashmap_varfield_get(Frhashmap_header *p_hash_hdr, char *p_name);

/*!
 * hash表里释放指定Frvar_field值节点
 *
 * \param p_hash_hdr   (*Frhash_header)
 * \param p_name        (Frvar_field字段名)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frhashmap_varfield_del(Frhashmap_header *p_hash_hdr, char *p_name);

/*!
 * 节点内容出力
 *
 * \param p_hash_hdr       (Frhashmap_header *)
 * \param pp_outbuff       (出力内容指针)
 *        
 */
void frhashmap_varfield_output(Frhashmap_header *p_hash_hdr, char **pp_outbuff);

#endif
